--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXST/Filters.c 0.5.1 (e5d2956e) Text, 3.69 KB
T8b949e// Copyright 2024-2026, Mark Qvist
Tff7b72#Tff7b72include T8b949e<math.h>
Tffa657void Td2a8ffhighpass_filterTb4b4b4(Tffa657floatTff7b72* Te6edf3inputTb4b4b4, Tffa657floatTff7b72* Te6edf3outputTb4b4b4, Tffa657int Te6edf3samplesTb4b4b4, Tffa657int Te6edf3channelsTb4b4b4, Tffa657float Te6edf3alphaTb4b4b4, Tffa657floatTff7b72* Te6edf3filter_statesTb4b4b4, Tffa657floatTff7b72* Te6edf3last_inputsTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3iTb4b4b4, Te6edf3chTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657float Te6edf3input_diff Tff7b72= Te6edf3inputTb4b4b4[Te6edf3chTb4b4b4] Tff7b72- Te6edf3last_inputsTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4; Te6edf3outputTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3alpha Tff7b72* Tb4b4b4(Te6edf3filter_statesTb4b4b4[Te6edf3chTb4b4b4] Tff7b72+ Te6edf3input_diffTb4b4b4)Tb4b4b4; Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff1Tb4b4b4; Te6edf3i Tff7b72< Te6edf3samplesTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Tffa657float Te6edf3input_diff Tff7b72= Te6edf3inputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72- Te6edf3inputTb4b4b4[Te6edf3idx Tff7b72- Te6edf3channelsTb4b4b4]Tb4b4b4; Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72= Te6edf3alpha Tff7b72* Tb4b4b4(Te6edf3outputTb4b4b4[Te6edf3idx Tff7b72- Te6edf3channelsTb4b4b4] Tff7b72+ Te6edf3input_diffTb4b4b4)Tb4b4b4; Tb4b4b4} Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3last_idx Tff7b72= Tb4b4b4(Te6edf3samples Tff7b72- T79c0ff1Tb4b4b4) Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3filter_statesTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3outputTb4b4b4[Te6edf3last_idxTb4b4b4]Tb4b4b4; Te6edf3last_inputsTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3inputTb4b4b4[Te6edf3last_idxTb4b4b4]Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8fflowpass_filterTb4b4b4(Tffa657floatTff7b72* Te6edf3inputTb4b4b4, Tffa657floatTff7b72* Te6edf3outputTb4b4b4, Tffa657int Te6edf3samplesTb4b4b4, Tffa657int Te6edf3channelsTb4b4b4, Tffa657float Te6edf3alphaTb4b4b4, Tffa657floatTff7b72* Te6edf3filter_statesTb4b4b4) Tb4b4b4{
Tffa657int Te6edf3iTb4b4b4, Te6edf3chTb4b4b4;
Tffa657float Te6edf3one_minus_alpha Tff7b72= T79c0ff1.0f Tff7b72- Te6edf3alphaTb4b4b4;
Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3outputTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3alpha Tff7b72* Te6edf3inputTb4b4b4[Te6edf3chTb4b4b4] Tff7b72+ Te6edf3one_minus_alpha Tff7b72* Te6edf3filter_statesTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4; Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72= T79c0ff1Tb4b4b4; Te6edf3i Tff7b72< Te6edf3samplesTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72= Te6edf3alpha Tff7b72* Te6edf3inputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72+ Te6edf3one_minus_alpha Tff7b72* Te6edf3outputTb4b4b4[Te6edf3idx Tff7b72- Te6edf3channelsTb4b4b4]Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tff7b72for Tb4b4b4(Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3last_idx Tff7b72= Tb4b4b4(Te6edf3samples Tff7b72- T79c0ff1Tb4b4b4) Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3filter_statesTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3outputTb4b4b4[Te6edf3last_idxTb4b4b4]Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tffa657void Td2a8ffagc_processTb4b4b4(Tffa657floatTff7b72* Te6edf3inputTb4b4b4, Tffa657floatTff7b72* Te6edf3outputTb4b4b4, Tffa657int Te6edf3samplesTb4b4b4, Tffa657int Te6edf3channelsTb4b4b4, Tffa657float Te6edf3target_linearTb4b4b4, Tffa657float Te6edf3max_gain_linearTb4b4b4, Tffa657float Te6edf3trigger_levelTb4b4b4,
Tffa657float Te6edf3attack_coeffTb4b4b4, Tffa657float Te6edf3release_coeffTb4b4b4, Tffa657float Te6edf3hold_samplesTb4b4b4, Tffa657floatTff7b72* Te6edf3current_gain_linTb4b4b4, Tffa657intTff7b72* Te6edf3hold_counterTb4b4b4, Tffa657int Te6edf3block_targetTb4b4b4) Tb4b4b4{
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3samples Tff7b72* Te6edf3channelsTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Te6edf3outputTb4b4b4[Te6edf3iTb4b4b4] Tff7b72= Te6edf3inputTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4; Tb4b4b4}
Tffa657int Te6edf3num_blocks Tff7b72= Te6edf3block_targetTb4b4b4;
Tffa657int Te6edf3block_size Tff7b72= Te6edf3samples Tff7b72/ Te6edf3num_blocksTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block_size Tff7b72< T79c0ff1Tb4b4b4) Te6edf3block_size Tff7b72= T79c0ff1Tb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3block Tff7b72= T79c0ff0Tb4b4b4; Te6edf3block Tff7b72< Te6edf3num_blocksTb4b4b4; Te6edf3blockTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657int Te6edf3block_start Tff7b72= Te6edf3blockTff7b72*Te6edf3block_sizeTb4b4b4;
Tffa657int Te6edf3block_end Tff7b72= Tb4b4b4(Te6edf3block Tff7b72+ T79c0ff1Tb4b4b4)Tff7b72*Te6edf3block_sizeTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block Tff7b72=Tff7b72= Te6edf3num_blocks Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{ Te6edf3block_end Tff7b72= Te6edf3samplesTb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3block_end Tff7b72> Te6edf3samplesTb4b4b4) Tb4b4b4{ Te6edf3block_end Tff7b72= Te6edf3samplesTb4b4b4; Tb4b4b4}
Tffa657int Te6edf3block_samples Tff7b72= Te6edf3block_end Tff7b72- Te6edf3block_startTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3block_samples Tff7b72<Tff7b72= T79c0ff0Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657float Te6edf3sum_squares Tff7b72= T79c0ff0.0fTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= Te6edf3block_startTb4b4b4; Te6edf3i Tff7b72< Te6edf3block_endTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3sum_squares Tff7b72+Tff7b72= Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72* Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4]Tb4b4b4; Tb4b4b4}
Tffa657float Te6edf3rms Tff7b72= Te6edf3sqrtfTb4b4b4(Te6edf3sum_squares Tff7b72/ Te6edf3block_samplesTb4b4b4)Tb4b4b4;
Tffa657float Te6edf3target_gainTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3rms Tff7b72> T79c0ff1e-9f Tff7b72&Tff7b72& Te6edf3rms Tff7b72> Te6edf3trigger_levelTb4b4b4) Tb4b4b4{
Te6edf3target_gain Tff7b72= Te6edf3target_linear Tff7b72/ Te6edf3rmsTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3target_gain Tff7b72> Te6edf3max_gain_linearTb4b4b4) Tb4b4b4{ Te6edf3target_gain Tff7b72= Te6edf3max_gain_linearTb4b4b4; Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{ Te6edf3target_gain Tff7b72= Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4; Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3target_gain Tff7b72< Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3attack_coeff Tff7b72* Te6edf3target_gain Tff7b72+ Tb4b4b4(T79c0ff1.0f Tff7b72- Te6edf3attack_coeffTb4b4b4) Tff7b72* Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4;
Tff7b72*Te6edf3hold_counter Tff7b72= Tb4b4b4(Tffa657intTb4b4b4)Te6edf3hold_samplesTb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72*Te6edf3hold_counter Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{ Tff7b72*Te6edf3hold_counter Tff7b72-Tff7b72= Te6edf3block_samplesTb4b4b4; Tb4b4b4}
Tff7b72else Tb4b4b4{ Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4] Tff7b72= Te6edf3release_coeff Tff7b72* Te6edf3target_gain Tff7b72+ Tb4b4b4(T79c0ff1.0f Tff7b72- Te6edf3release_coeffTb4b4b4) Tff7b72* Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= Te6edf3block_startTb4b4b4; Te6edf3i Tff7b72< Te6edf3block_endTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72*Tff7b72= Te6edf3current_gain_linTb4b4b4[Te6edf3chTb4b4b4]Tb4b4b4; Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tffa657float Te6edf3peak_limit Tff7b72= T79c0ff0.75fTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3ch Tff7b72= T79c0ff0Tb4b4b4; Te6edf3ch Tff7b72< Te6edf3channelsTb4b4b4; Te6edf3chTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{
Tffa657float Te6edf3peak Tff7b72= T79c0ff0.0fTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3samplesTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Tffa657float Te6edf3abs_val Tff7b72= Te6edf3fabsfTb4b4b4(Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4]Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3abs_val Tff7b72> Te6edf3peakTb4b4b4) Tb4b4b4{ Te6edf3peak Tff7b72= Te6edf3abs_valTb4b4b4; Tb4b4b4} Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3peak Tff7b72> Te6edf3peak_limitTb4b4b4) Tb4b4b4{ Tffa657float Te6edf3scale Tff7b72= Te6edf3peak_limit Tff7b72/ Te6edf3peakTb4b4b4;
Tff7b72for Tb4b4b4(Tffa657int Te6edf3i Tff7b72= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72< Te6edf3samplesTb4b4b4; Te6edf3iTff7b72+Tff7b72+Tb4b4b4) Tb4b4b4{ Tffa657int Te6edf3idx Tff7b72= Te6edf3i Tff7b72* Te6edf3channels Tff7b72+ Te6edf3chTb4b4b4; Te6edf3outputTb4b4b4[Te6edf3idxTb4b4b4] Tff7b72*Tff7b72= Te6edf3scaleTb4b4b4; Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────